package ve.com.wayoyo.wuml_case;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import android.graphics.Point;

import ve.com.wayoyo.wuml_case.DibujoDiagramas.CompAtributo;
import ve.com.wayoyo.wuml_case.DibujoDiagramas.CompClase;
import ve.com.wayoyo.wuml_case.DibujoDiagramas.CompMetodo;
import ve.com.wayoyo.wuml_case.DibujoDiagramas.CompVariable;
import ve.com.wayoyo.wuml_case.DibujoDiagramas.Componente;
import ve.com.wayoyo.wuml_case.DibujoDiagramas.Diagrama;
import ve.com.wayoyo.wuml_case.DibujoDiagramas.FactoryDiagrama;
import ve.com.wayoyo.wuml_case.Exceptions.FormatoDiagramaInvalidoExecption;

public class Loader {

		public Diagrama cargarDiagrama(String path){
			Diagrama diagrama = null;
			try{
				File a = new File(path);
				
				DocumentBuilder docBuilder=DocumentBuilderFactory.newInstance().newDocumentBuilder();
				Document doc=docBuilder.parse(a);
				NodeList diagramas = doc.getElementsByTagName("Diagrama");
				
				if(diagramas != null && diagramas.getLength() > 0){
					diagrama = FactoryDiagrama.factory(((Element)diagramas.item(0)).getAttribute("Tipo"));
					diagrama.setNombre(((Element)diagramas.item(0)).getAttribute("Nombre"));
					diagrama.setLastIdGiven(Integer.valueOf(((Element)diagramas.item(0)).getAttribute("UltimoID")));
					
					NodeList componentes = ((Element)diagramas.item(0)).getElementsByTagName("Componente");
					for (int i = 0; i < componentes.getLength(); i++) {
						diagrama.AgregarComponente(loadComponent((Element)componentes.item(i)));
					}
				}else{
					throw new FormatoDiagramaInvalidoExecption();
				}
		        
			}catch(Exception e){
				 //xpp.setInput(new StringReader ("<Diagrama><Titulo>Nuevo</Titulo><Tipo>Clase</Tipo></Diagrama>"));
				System.out.println(e.getMessage());
			}
			
			return diagrama;
		}
		
		private Componente loadComponent(Element source){
			String Tipo = source.getAttribute("Tipo");
			if(Tipo.equals("Clase")){
				CompClase nuevo = new CompClase(source.getAttribute("Titulo"));
				nuevo.setAnchor(new Point(Integer.valueOf(source.getAttribute("AnchorX")),Integer.valueOf(source.getAttribute("AnchorY"))));
				nuevo.setID(Integer.valueOf(source.getAttribute("ID")));
				NodeList atributos = source.getElementsByTagName("Atributo");
				for (int i = 0; i < atributos.getLength(); i++) {
					Element attrSource = (Element)atributos.item(i);
					CompAtributo attrNuevo = new CompAtributo(attrSource.getAttribute("NombreVariable"), attrSource.getAttribute("NivelAcceso"));
					attrNuevo.setTipoDato(attrSource.getAttribute("TipoDato"));
					if(attrSource.getAttribute("isFinal").equals("true"))
						attrNuevo.setFinal(true);
					if(attrSource.getAttribute("isStatic").equals("true"))
						attrNuevo.setStatic(true);
					if(attrSource.getAttribute("isVolatile").equals("true"))
						attrNuevo.setVolatile(true);
					NodeList multiplicidad = attrSource.getElementsByTagName("Multiplicidad");
					if(multiplicidad.getLength() > 0){
						try {
							attrNuevo.set_haveMultiplicity(true);
							attrNuevo.set_leftMultiplicity(((Element)multiplicidad.item(0)).getAttribute("Left"));
							attrNuevo.set_rightMultiplicity(((Element)multiplicidad.item(0)).getAttribute("Right"));
						} catch (Exception e) {
							System.out.println(e.getMessage());
						}
					}
					nuevo.addAtributo(attrNuevo);
				}
				NodeList metodos = source.getElementsByTagName("Metodo");
				for (int i = 0; i < metodos.getLength(); i++) {
					Element metSource = (Element)metodos.item(i);
					CompMetodo metNuevo = new CompMetodo(metSource.getAttribute("Nombre"), metSource.getAttribute("NivelAcceso"));
					metNuevo.setTipoDato(metSource.getAttribute("TipoDato"));
					if(metSource.getAttribute("IsStatic").equals("true"))
						metNuevo.set_isStatic(true);
					if(metSource.getAttribute("IsAbstract").equals("true"))
						metNuevo.set_isAbstract(true);
					if(metSource.getAttribute("IsFinal").equals("true"))
						metNuevo.set_isFinal(true);
					NodeList varEntradas = metSource.getElementsByTagName("VariableEntrada");
					for (int i1 = 0; i1 < varEntradas.getLength(); i1++) {
						Element varSource = (Element)varEntradas.item(i1);
						CompVariable varNueva = new CompVariable(varSource.getAttribute("Nombre"), varSource.getAttribute("TipoDato"));
						if(metSource.getAttribute("IsFinal").equals("true"))
							varNueva.setFinal(true);
						metNuevo.addVariable(varNueva);
						
					}
					nuevo.addMetodo(metNuevo);
				}
				return nuevo;
			}else{
				return null;
			}
		}
		
		
}
